import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;

public class LinkBetter {
    //更优的链接方式
    public static void main(String[] args) {
        // MysqlDataSource 支持一个类执行多个sql，直到数据源关闭
        // 通过一个链接池管理多个链接，当要执行sql语句的时侯，从池种取出一个链接，使用过后放回
        // 定义sql数据源对象
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        //设置数据库链接
        mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/study_db?characterEncoding=utf8&allowPublicKeyRetrieval" +
                "=true&useSSL=false");
        mysqlDataSource.setUser("root");
        mysqlDataSource.setPassword("tang1");
        //定义jdbc的数据源对象 这个数据原就是和之前使用的DriverManager一样
        DataSource dataSource = mysqlDataSource;
        //定义连接源
        Connection connection = null;
        //定义sql预处理对象
        PreparedStatement statement = null;
        //定义结果集对象
        ResultSet resultSet = null;

        try {
            //通过数据源连接数据库
            connection = dataSource.getConnection();
            //定义要使用的sql要使用?来占位
            String sql = "select 学号,name,chinese,math,english from students_mark where name = ?";
            //预编译sql指令prepareStatement 先给入sql在给指定的查询条件
            statement = connection.prepareStatement(sql);
            Scanner in = new Scanner(System.in);
            System.out.println("请输入名字");
            String name = in.nextLine();
            //前面的数字对应的是?的为值，后面的就是查询条件了
            statement.setString(1, name);
            //获得结果集
            resultSet = statement.executeQuery();//执行sql语句
            //打印数据
            while (resultSet.next()) {
                long Id = resultSet.getLong(1);
                String stuName = resultSet.getString(2);
                double markC = resultSet.getDouble(3);
                double markM = resultSet.getDouble(4);
                double markE = resultSet.getDouble(5);
                System.out.println(MessageFormat.format("学号 = {0}  名字 = {1} 语文 = {2}  数学 = {3}  英语 = {}",
                        Id, stuName, markC, markM, markE));
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            close(connection,statement,resultSet);
        }

    }

    private static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
        //关闭资源 后用先关
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
